/*
 * 变量声明使用
 * */
package stage1.test;

import java.util.Random;
import java.util.Scanner;

public class Hello {
    public static void main(String[] args) {
//        byteTest();
//        shortTest();
//        intTest();
//        longTest();
//        floatTest();
//        doubleTest();
//        booleanTest();
//        charTest();
//        unicodeTest();
//        基本数据类型转换
//        transformTest();

//        arithmeticOperator();
//        timeSecondsSplit();
//        spielTest();
//        bitTest();
//        salaryPrice();
//        taxiPrice();

//        narcissisticNumber();

//        forTest();

//        ffc();
//        multiplicationtableTest();

//        primeTest();
//        numberOfReversals();

//        arrayTest();
//        arrayadus();

//        randomTest();
//        sumN();

//        arrayTtest();

//        arrayY();
//        arrayNotice();

//        Hello hello = new Hello();
//        hello = null;

//        System.out.println(recursionTest(55));
//        System.out.println(recursionTest1(55));

        System.out.println(args.length);
        for (int i =0;i<args.length;i++){
            System.out.println(args[i]);
        }
    }

    static {
        System.out.println("静态代码块");
    }

    {
        System.out.println("构造块");
    }

    // 递推测试
    static int recursionTest1(int n){
        int parameter = 1;
        int parameter1 = 2;
        for (int i=3;i<=n;i++){
            int parameter2 = parameter +parameter1;
            parameter = parameter1;
            parameter1 = parameter2;
        }
        return parameter1;
    }

    // 递归测试
    static int recursionTest(int n) {
        return 1 == n ? 1 : n * recursionTest(n - 1);
    }

    // 构造方法
    Hello() {
        System.out.println(1111);
    }

    // 数组作为参数传递时测试 形参修改实参也跟随变化
    static void arrayNotice() {
        int[] parameter = new int[]{10, 20};
        arrayNoticeB(parameter);
        System.out.println(parameter[0]); // 200
    }

    static void arrayNoticeB(int[] parameter) {
        parameter[0] = 200;
        System.out.println(parameter[0]); //200
    }

    // 数组实现杨辉三角
    static void arrayY() {
        // 1 提示用户输入一个数字作为行数
        System.out.println("请输入一个行数：");
        Scanner scanner = new Scanner(System.in);
        int parameter = scanner.nextInt();
        // 2 根据用户输入的行数声明对应的二维数组
        int[][] parameter1 = new int[parameter][];
        // 3 针对二维数组中每个元素进行初始化，使用双重for循环
        for (int i = 0; i < parameter; i++) {
            parameter1[i] = new int[i + 1];
            for (int j = 0; j <= i; j++) {
                if (0 == j || i == j) {
                    parameter1[i][j] = 1;
                } else {
                    parameter1[i][j] = parameter1[i - 1][j] + parameter1[i - 1][j - 1];
                }
            }
        }
        // 4 打印最终生成的结果
        for (int i = 0; i < parameter; i++) {
            for (int j = 0; j <= i; j++) {
                System.out.print(parameter1[i][j] + " ");
            }
            System.out.println();
        }
    }

    // 二维数组测试
    static void arrayTtest() {
        int[][] parameter = new int[2][6];
        for (int i = 0; i < parameter.length; i++) {
            for (int j = 0; j < parameter[i].length; j++) {
                System.out.print(parameter[i][j] + "");
            }
            System.out.println();
        }
    }

    // 统计数字
    static void sumN() {
        int parameter = 12221143;
        int[] parameter1 = new int[10];
        int parameter2 = parameter;
        while (parameter2 > 0) {
            parameter1[parameter2 % 10]++;
            parameter2 /= 10;
        }

        for (int i = 0; i < parameter1.length; i++) {
            if (parameter1[i] > 0) {
                System.out.println(parameter + "，的统计结果为-" + i + ":" + parameter1[i]);
            }
        }
    }

    // 随机数测试
    static void randomTest() {
        Random random = new Random();
        System.out.println(random.nextInt(100));
    }

    // 数组增删改查
    static void arrayadus() {
        // 1 声明一个长度5 类型int 的数组
        int[] parameter = new int[5];
        // 打印所有值
        for (int i = 0; i < parameter.length; i++) {
            System.out.println("parameter " + i + "----" + parameter[i]);
        }

        System.out.println("-----------------------");
        // 2 将数据 11 22 33 44 赋值
        for (int i = 0; i < parameter.length - 1; i++) {
            parameter[i] = (i + 1) * 11;
        }
        // 打印修改后的值
        for (int i = 0; i < parameter.length; i++) {
            System.out.println("parameter " + i + "----" + parameter[i]);
        }

        System.out.println("-----------------------");
        // 3 55插入下标为零的位置，原有元素向后移动
        for (int i = parameter.length - 1; i > 0; i--) {
            parameter[i] = parameter[i - 1];
        }
        parameter[0] = 55;
        for (int i = 0; i < parameter.length; i++) {
            System.out.println("parameter " + i + "----" + parameter[i]);
        }

        System.out.println("-----------------------");
        // 4 删除55，删除方式为后续元素往前移动，最后一个位置赋值0
        for (int i = 0; i < parameter.length - 1; i++) {
            parameter[i] = parameter[i + 1];
        }
        parameter[4] = 0;
        for (int i = 0; i < parameter.length; i++) {
            System.out.println("parameter " + i + "----" + parameter[i]);
        }

        System.out.println("-----------------------");
        // 5 查找素组中是否有 22 ，若有则改为220
        for (int i = 0; i < parameter.length; i++) {
            if (22 == parameter[i]) {
                parameter[i] = 220;
            }
        }

        for (int i = 0; i < parameter.length; i++) {
            System.out.println("parameter " + i + "----" + parameter[i]);
        }
    }

    // 数组测试
    static void arrayTest() {
        // 1 声明一个长度为2的数组
        int[] parameter = new int[2];
        // 2 打印一维数组的长度以及每个数组元素的数值
        System.out.println("parameter长度 " + parameter.length);
        // 3 使用for循环打印数组中所有元素的值
        for (int i = 0; i < parameter.length; i++) {
            System.out.println("parameter " + i + "------" + parameter[i]);
        }
        // 4 声明一个长度为5的元素类型为double的一维数组
        double[] parameter2 = new double[5];
        for (int i = 0; i < parameter2.length; i++) {
            System.out.println("parameter2 " + i + "---" + parameter2[i]);
        }
        // 5 声明数组的同时就对数组中的元素进行初始化
        char[] parameter3 = {'a', 'b', 'c'};
        for (int i = 0; i < parameter3.length; i++) {
            System.out.println("parameter3 " + i + "----" + parameter3[i]);
        }
        // 6 特殊的写法，静态方式
        boolean[] parameter4 = new boolean[]{true, false, true};
        for (int i = 0; i < parameter4.length; i++) {
            System.out.println("parameter4 " + i + "---" + parameter4[i]);
        }
    }

    // 反转数 任意输入一个数，实现反向输出
    static void numberOfReversals() {
        // 1 提示用户输入一个正整数，并使用变量记录 123
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个正整数：");
        int parameter = 123;

        // 2 使用while 循环进行拆分并打印
        int result = 0;
        int parameterCopay = parameter;
        while (parameterCopay > 0) {
//            System.out.println(parameter % 10);
            result = result * 10 + parameterCopay % 10;
//            System.out.println("parameterCopay %10 =" + parameterCopay % 10);
            parameterCopay /= 10;
//            System.out.println("parameterCopay = " + parameterCopay);
        }

        // 3 打印逆序后的结果
        System.out.println(result);
    }

    // 2-100的所有素数
    static void primeTest() {
        for (int i = 1; i < 101; i++) {
            boolean flag = true;
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (0 == i % j) {
                    flag = false;
                    break;
                }
            }

            if (flag) {
                System.out.println("素数：" + i);
            }
        }
    }

    // 99乘法表
    static void multiplicationtableTest() {
        outer:
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "*" + i + "=" + j * i + " ");

                // 打印完6*6的时候终止
                if (6 == j) {
                    break outer;
                }
            }
            System.out.println();
        }
    }

    // 五行五列
    static void ffc() {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                System.out.print("厉害了我的哥 ");
            }
            System.out.println();
        }
    }

    // 聊天代码进行了一点优化
    static void forTest() {
        boolean flag = true;
        for (; ; ) {
            String people = flag ? "张三" : "李四";
            // 1 提示用户输入聊天内容并保存
//            System.out.println(people + "，请输入要发送的聊天内容：");
            Scanner scanner = new Scanner(System.in);
            String chart = scanner.next();

            // 2 判断用户输入的聊天内容是否为 bye ，是的话结束
            if ("bye".equals(chart)) {
                System.out.println("聊天结束！");
                break;
            }

            System.out.println(people + "：" + chart + "\n========");
            flag = !flag;
        }
    }

    // 水仙花数 Narcissistic number
    static void narcissisticNumber() {
        // 1 使用for循环打印所有三位数
        for (int i = 100; i <= 999; i++) {
            // 打印所有数字
            // System.out.println(i);

            // 2 判断是否水仙花数
            // 拆分百位
            int parameter1 = i / 100;
            // 拆分十位
            int parameter2 = i % 100 / 10;
            // 拆分个位
            int parameter3 = i % 10;
            if (parameter1 * parameter1 * parameter1 + parameter2 * parameter2 * parameter2 + parameter3 * parameter3 * parameter3 == i) {
                System.out.println(i);
            }
        }
    }

    static void taxiPrice() {
        // 1 提示用户输入公里数和等待的秒数并使用变量记录
        System.out.println("请输入公里数和等待的秒数:");
        Scanner scanner = new Scanner(System.in);
        int km = scanner.nextInt();
        int scends = scanner.nextInt();
        int kmPrice = 0;
        if (km <= 3) {
            kmPrice = 13;
        } else if (km <= 15) {
            kmPrice = 13 + (km - 3) * 2;
        } else {
            kmPrice = 13 + (15 - 3) * 2 + (km - 15) * 3;
        }

        int secPrice = scends / 150;

        int num = kmPrice + secPrice;
        System.out.println("本次出租车费用：" + num);
    }

    static void salaryPrice() {
        // 个人所得税
        double salaryPrice = 0.0;
        System.out.println("请输入你的薪水：");
        Scanner scanner = new Scanner(System.in);
        int salary = scanner.nextInt();

        // 使用if else判断 个人所得税
        if (salary <= 5000) {
            System.out.println("无须纳税：");
        } else if (salary <= 8000) {
//            salaryPrice = (salary - 5000) * 0.03;
            salaryPrice = (salary - 5000) * 0.03 - 0;
        } else if (salary <= 17000) {
//            salaryPrice = (salary - 8000) * 0.1 + (8000 - 5000) * 0.03;
            salaryPrice = (salary - 5000) * 0.1 - 210;
        } else if ((salary <= 3000)) {
            salaryPrice = (salary - 5000) * 0.2 - 1410;
        }

        System.out.println("最终的个人所得税：" + salaryPrice);
    }

    static void bitTest() {
        // 1 声明两个byte类型的变量并初始化
        byte parameter1 = 11;
        byte parameter2 = 13;

        // 2 打印变量的数值
        System.out.println("parameter1 = " + parameter1);
        System.out.println("parameter2 = " + parameter2);

        System.out.println("-------------------");
        // 3 实现位运算符的使用
        // parameter1的二进制为：0000 1011
        // parameter2的二进制为：0000 1101

        // 按位与：同一为一，一零为零            按位与后的二进制：0000 1001 转为十进制 9
        System.out.println(parameter1 & parameter2);
        // 按位或：一一为一，同零为零            按位或后的二进制：0000 1111 转为十进制 15
        System.out.println(parameter1 | parameter2);
        // 按位异或：相同为零，不同为一           按位异或后的二进制：0000 0110 转为十进制 6
        System.out.println(parameter1 ^ parameter2);
        // 按位取反：一为零，零为一              按位取反后的二进制：1111 0100
        // 转十进制 1111 0100 -> 先减一 1111 0011 -> 按位取反 0000 1100 -> 12 -> 添加符号 -12
        System.out.println(~parameter1);

    }

    static void spielTest() {
        int parameter = 8;
        System.out.println(parameter++);
        System.out.println(++parameter);
    }

    // 秒数拆分
    static void timeSecondsSplit() {
        // 1 提示用户输入正整数秒数并用变量记录、
        System.out.println("请输入一个正整数的秒数：");
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();

        // 2 将正整数的秒数拆分为时分秒后并用变量记录
        int hour = num / 3600;
        int min = num % 3600 / 60;
        int sec = num % 60;
        System.out.println(num + "秒转换为：" + hour + "小时" + min + "分钟" + sec + "秒");
    }

    static void arithmeticOperator() {

        // 1 变量定义
        int parameter1 = 6;
        int parameter2 = 2;
        System.out.println("parameter1 = " + parameter1);
        System.out.println("parameter2 = " + parameter2);

        int parameter3 = parameter1 + parameter2;
        System.out.println("parameter3 = " + parameter3);
        System.out.println("----------------------------");

        // 2 上述变量的使用
        System.out.println(parameter1 + parameter2);
        System.out.println(parameter1 - parameter2);
        System.out.println(parameter1 * parameter2);
        System.out.println(parameter1 / parameter2);
        System.out.println(parameter1 % parameter2);
        System.out.println("----------------------------");

        // 3 注意事项
        // 3.1当两个整数相除，结果只保留整数部分，丢弃小数部分；
        System.out.println(5 / 2);

        // 3.2.1 保留小数部分（强制转换其中一个数字为double）
        System.out.println((double) 5 / 2);
        System.out.println(5 / (double) 2);
        System.out.println((double) 5 / (double) 2);
        System.out.println((double) (5 / 2));

        // 3.2.2 保留小数部分 (其中一个数乘以1.0)
        System.out.println(5 * 1.0 / 2);
        System.out.println(5.0 / 2);
        System.out.println("----------------------------");

        // 3.3 0不能做除数
        // System.out.println(5/0);
        System.out.println(5 / 0.0);// Infinity
        System.out.println(0 / 0.0);//NaN

    }

    public static void transformTest() {
        byte by = 10;
        short sh = 20;
        System.out.println(by);
        System.out.println(sh);

//数据类型转换
        sh = by;
        System.out.println(sh);

        sh = 128;

        by = (byte) sh;
        System.out.println(by);
    }

    public static void unicodeTest() {
        char ch1 = '\u5b59';
        char ch2 = '\u5f3a';
        System.out.println(ch1);
        System.out.println(ch2);
    }

    public static void charTest() {
        char ch = 'a';
        System.out.println((int) ch);

        char ch2 = 98;
        System.out.println(ch2);
    }

    public static void booleanTest() {
        boolean bl = false;
        System.out.println(bl);
    }


    public static void doubleTest() {
        double dl = 3.1415926;
        System.out.println(dl);
    }

    public static void floatTest() {
        float fl = 3.1415926666f;
        System.out.println(fl);
    }

    public static void byteTest() {
        byte by = 25;

        System.out.println(by);
    }

    public static void shortTest() {
        short sh = 250;
        System.out.println(sh);
    }

    public static void intTest() {
        int in = 250250;
        System.out.println(in);
    }

    public static void longTest() {
        long lo = 250250250250L;
        System.out.println(lo);
    }
}
